

#include "com_android_CardReaders_prop.h"
#include     <stdio.h>      
#include     <stdlib.h>     
#include     <unistd.h>     
#include     <sys/types.h>  
#include     <sys/stat.h>   
#include     <fcntl.h>      
#include     <termios.h>    
#include     <errno.h>      
#include     <string.h>
#include 	 <jni.h>
#include     <android/log.h>
#include <termios.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
#include <jni.h>

#include <sys/system_properties.h>
#define  LOG_TAG 	"Hf-Switch-JNI"
#define  ALOGD(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, fmt, ##args)

#define  property_get(name, value, default_value)  __system_property_get(name, value)
static const char *TAG="serial_port";
#define LOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO,  TAG, fmt, ##args)
#define LOGD(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, TAG, fmt, ##args)
#define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, TAG, fmt, ##args)

int rfid_sw_fd = -1;	// The rfid fd of switching node HF/UHF

jint   Java_com_ivsign_android_IDCReader_prop_getpropCharTojstringa(JNIEnv*   env , jclass thiz, jbyteArray  an){
		char android_ver[30];
		int res=-1;

		memset(android_ver,0,10);
		res=property_get("pwv.project",android_ver,"");
		ALOGD("etpropCharTojstring:%s", android_ver);
		jsize len = (*env)->GetArrayLength(env,an);
		jbyte *an1 = (*env)->GetByteArrayElements(env,an, NULL);
    	memcpy( an1,android_ver,  8);
   	(*env)->ReleaseByteArrayElements( env,an,  an1, 0);
   	ALOGD("etpropCharTojstring");
		return 1;
} 

static speed_t getBaudrate(jint baudrate)
{
        switch(baudrate) {
        case 0: return B0;
        case 50: return B50;
        case 75: return B75;
        case 110: return B110;
        case 134: return B134;
        case 150: return B150;
        case 200: return B200;
        case 300: return B300;
        case 600: return B600;
        case 1200: return B1200;
        case 1800: return B1800;
        case 2400: return B2400;
        case 4800: return B4800;
        case 9600: return B9600;
        case 19200: return B19200;
        case 38400: return B38400;
        case 57600: return B57600;
        case 115200: return B115200;
        case 230400: return B230400;
        case 460800: return B460800;
        case 500000: return B500000;
        case 576000: return B576000;
        case 921600: return B921600;
        case 1000000: return B1000000;
        case 1152000: return B1152000;
        case 1500000: return B1500000;
        case 2000000: return B2000000;
        case 2500000: return B2500000;
        case 3000000: return B3000000;
        case 3500000: return B3500000;
        case 4000000: return B4000000;
        default: return -1;
        }
}


int fdde;
JNIEXPORT jobject JNICALL Java_com_ivsign_android_IDCReader_prop_open(
		JNIEnv *env, jclass thiz, jstring path, jint baudrate, jint flags) {

	//把进程挂起一段时间， 单位是微秒
//	usleep(50*1000);
	int fd;
	speed_t speed;
	jobject mFileDescriptor;
	int err;
	struct termios curr_term;
	LOGI("------------------Java_android_serialport_SerialPort_open--------");
	/* Check arguments */
	{
		speed = getBaudrate(baudrate);
		if (speed == -1) {
			/* TODO: throw an exception */
			LOGE("Invalid baudrate");
			return NULL;
		}
	}

	/* Opening device */
	{
		jboolean iscopy;
		const char *path_utf = (*env)->GetStringUTFChars(env, path, &iscopy);
		LOGD("Opening serial port %s with flags 0x%x", path_utf,
				O_RDWR | flags);
		fd = open(path_utf, O_RDWR | O_SYNC);
		fdde=fd;
		//fd = open(path_utf, O_RDWR | flags);
		LOGD("open() fd = %d", fd);
		(*env)->ReleaseStringUTFChars(env, path, path_utf);
		if (fd == -1) {
			/* Throw an exception */
			LOGE("Cannot open port");
			/* TODO: throw an exception */
			return NULL;
		}
	}

	/* Configure device */
	{

		tcflush(fd, TCIOFLUSH);

		if ((err = tcgetattr(fd, &curr_term)) != 0) {
			printf("gsd4e_channel_open: tcgetattr(%d) = %d,  errno %d\r\n", fd,
					err, errno);
			close(fd);
			return (-1);
		}
		curr_term.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR
				| ICRNL | IXON);
		curr_term.c_oflag &= ~OPOST;
		curr_term.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
		curr_term.c_cflag &= ~(CSIZE | PARENB);

		//Even parity (8E1):
		//curr_term.c_cflag &= ~CSIZE;
		//curr_term.c_cflag |= PARENB;
		//curr_term.c_cflag &= ~PARODD;
		//curr_term.c_cflag &= ~CSTOPB;

		//Odd parity (8O1):
		//curr_term.c_cflag |= PARENB
		//curr_term.c_cflag |= PARODD
		//curr_term.c_cflag &= ~CSTOPB
		//curr_term.c_cflag &= ~CSIZE;


		curr_term.c_cflag |= CS8;
		curr_term.c_cflag &= ~CRTSCTS;

		tcsetattr(fd, TCSANOW, &curr_term);
		tcflush(fd, TCIOFLUSH);
		tcsetattr(fd, TCSANOW, &curr_term);
		tcflush(fd, TCIOFLUSH);
		tcflush(fd, TCIOFLUSH);

		if (cfsetispeed(&curr_term, speed)) {
			close(fd);
			return (-1);
		}

		if (cfsetospeed(&curr_term, speed)) {
			close(fd);
			return (-1);
		}
		tcsetattr(fd, TCSANOW, &curr_term);
	}

	/* Create a corresponding file descriptor */
	{
		jclass cFileDescriptor = (*env)->FindClass(env,
				"java/io/FileDescriptor");
		jmethodID iFileDescriptor = (*env)->GetMethodID(env, cFileDescriptor,
				"<init>", "()V");
		jfieldID descriptorID = (*env)->GetFieldID(env, cFileDescriptor,
				"descriptor", "I");
		mFileDescriptor = (*env)->NewObject(env, cFileDescriptor,
				iFileDescriptor);
		//设置属性descriptor的值为fd
		(*env)->SetIntField(env, mFileDescriptor, descriptorID, (jint) fd);
	}

	return mFileDescriptor;
}

JNIEXPORT void  JNICALL Java_com_ivsign_android_IDCReader_prop_close(JNIEnv *env, jobject thiz)
{

        LOGD("closefdde(fd = %d)", fdde);
        close(fdde);//mFileDescriptor
}


